 /*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  * James D Miles (IBM Corp.) - bug 182666, trim spaces from version id
  *******************************************************************************/
 package org.eclipse.update.internal.configurator;
 import java.io.*;
 import java.util.jar.*;

 import org.eclipse.osgi.util.*;
 import org.osgi.framework.*;
 /**
  * Parses MANIFEST.MF
  */
 public class BundleManifest implements IConfigurationConstants {
     private File manifestFile;
     private PluginEntry pluginEntry;
     private IOException exception;
     private String bundleURL;
     /**
      * Constructor for local file
      */
     public BundleManifest(File manifest) {
         super();
         manifestFile = manifest;
         if (manifest.exists() && !manifest.isDirectory()) {
             FileInputStream fos = null;
             try {
                 fos = new FileInputStream(manifest);
                 parse(fos);
             } catch (IOException ioe) {
             } finally {
                 if (fos != null) {
                     try {
                         fos.close();
                     } catch (IOException e) {
                     }
                 }
             }
         }
     }
         /**
          * Constructor for local file
          */
         public BundleManifest(InputStream input, String bundleUrl) {
             super();
             bundleURL = bundleUrl;
             if (input != null) {
                 parse(input);
             }
         }
     /**
      * Parses manifest, creates PluginEntry if manifest is valid, stores
      * exception if any occurs
      *
      * @param in
      * InputStream
      */
     private void parse(InputStream in) {
         try {
             Manifest m = new Manifest(in);
             Attributes a = m.getMainAttributes();
             // plugin id
 String symbolicName = a.getValue(Constants.BUNDLE_SYMBOLICNAME);
             if (symbolicName == null) {
                 // In Eclipse manifest must have Bundle-SymbolicName attribute
 return;
             }
             String id;
             try {
                 ManifestElement[] elements = ManifestElement.parseHeader(
                         Constants.BUNDLE_SYMBOLICNAME, symbolicName);
                 id = elements[0].getValue();
             } catch (BundleException be) {
                 throw new IOException(be.getMessage());
             }
             // plugin version
 String version = a.getValue(Constants.BUNDLE_VERSION);
             if (version == null) {
                 Utils.log(NLS.bind(Messages.BundleManifest_noVersion, (new String [] { Constants.BUNDLE_VERSION, id })));
                 return;
             }
             version = version.trim();
             String hostPlugin = a.getValue(Constants.FRAGMENT_HOST);
             pluginEntry = new PluginEntry();
             pluginEntry.setVersionedIdentifier(new VersionedIdentifier(id,
                     version));
             pluginEntry.isFragment(hostPlugin != null
                     && hostPlugin.length() > 0);
             // Set URL
 if(bundleURL!=null){
                 pluginEntry.setURL(bundleURL);
             }else{
                 File pluginDir = manifestFile.getParentFile();
                 if (pluginDir != null) {
                     pluginDir = pluginDir.getParentFile();
                 }
                 if (pluginDir != null){
                     pluginEntry.setURL(PLUGINS + "/" + pluginDir.getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
 }
             }
             //
 } catch (IOException ioe) {
             exception = ioe;
         }
     }
     public boolean exists() {
         return exception != null || pluginEntry != null;
     }
     /**
      * Obtains PluginEntry from a manifest.
      *
      * @return PluginEntry or null if valid manifest does not exist
      * @throws IOException
      * if exception during parsing
      */
     public PluginEntry getPluginEntry() throws IOException {
         if (exception != null) {
             throw exception;
         }
         return pluginEntry;
     }
 }

